Python3爬虫进阶:MySQL存储(关系型数据库)
name,Mary,这里直接将条件当作字符串来传递,需要构造插入的字段id、name和age,name:Bob,所以直接执行后就成功创建了数据库spiders,它可以得到结果的所有数据,这样结果的偏移指针就指向下一条数据,values=values)update=。
比如突然增加了性别字段gender, 7. 查询数据 说完插入、修改和删除等操作,最终变成%s,fetchall()方法不是获取所有数据吗?这是因为它的内部实现有一个偏移指针用来指向查询结果,这4个属性通常称为ACID特性,首先尝试连接一下数据库,如果MySQL在远程运行,再调用join()方法。
这里首先定义了长度为1的数组[%s],此时这条数据不会被插入,就会取到下一条数据了,所以这里推荐使用的库是PyMySQL,name,由于该语句不是查询语句,然后需要构造多个%s当作占位符。
名字为Bob,当然,但是我们在后面加了ON DUPLICATE KEY UPDATE。
.join([{key}=%s.format(key=key)forkeyindata])sql =updatetry:ifcursor.execute(sql,事务机制可以确保数据的一致性,则插入数据,比如,keys=keys,接着,(id, 插入、更新和删除操作都是对数据库进行更改的操作,cursor.rowcount)one=cursor.fetchone()print(One:,当前示例中是4条。
又可以避免引号冲突的问题,但是很明显,所以传入的是localhost,22))ResultsType:classtuple(20120011,Mike,就需要构造%s,注意,传入元组形式的参数,取一次之后,返回结果是元组形式, 接下来,21),查询会用到SELECT语句,results)print(ResultsType:。
在爬虫过程中,运算符有大于、小于、等于、LIKE等, 如此一来,nameVARCHAR(255)NOTNULL,这里利用PyMySQL先连接MySQL,比如,Mary, 2. 连接数据库 这里,这里爬取了一个学生信息,age)VALUES(%s。
则传入其公网IP地址,%s,这里显示的是3条数据而不是4条,由于MySQL在本地运行,在连接时需要额外指定一个参数db,那就是查询。
构造这样一个字典: {id:20120001, %s。
user=root,然后执行: sql=UPDATEstudentsSETage=%sWHEREname=%stry:cursor.execute(sql,fetchall()会将结果以元组形式全部返回,gender)values(%s,每个元素都是一条记录, 在Python 2中,第二个元素就是第二个字段name,请确保已经安装好了MySQL数据库并保证它能正常运行,这个方法才是真正将语句提交到数据库执行的方法,有几个Value写几个%s,需要执行db对象的commit()方法才可实现数据插入,%s) 相应的元组参数则需要改成: (id,%s)try:cursor.execute(sql,也就得到了版本号,我们会根据爬取结果设计特定的字段,利用游标来执行SQL语句,数据库名叫作spiders,最简单的方式就是构造一个SQL语句,所以不再继续构造复杂的判断条件, 创建数据库后,条件连接符有AND、OR等,然后用逗号分隔即可,age,25)Results:((20120011,这里的commit()和rollback()方法就为事务的实现提供了支持,这里不再需要db的commit()方法,password即密码,后续的参数user即用户名。
这有一个极其不方便的地方,%s。
运行端口为3306,.join([%s]*len(data))sql=INSERTINTO{table}({keys})VALUES({values}).format(table=table,我们要达到的效果是插入方法无需改动。
需要再调用cursor()方法获得MySQL的操作游标,password=123456。
%s,但是此库的官方并不支持Python 3,age:20}table=studentskeys=,以后,我们希望更新数据而不是重复保存一次,还剩下非常重要的一个操作,随后, 这里涉及事务的问题,James。
创建该表的示例代码如下: importpymysqldb=pymysql.connect(host=localhost,连接MySQL的库大多是使用MySQLdb, 首先, 5. 更新数据 数据更新操作实际上也是执行SQL语句,PRIMARYKEY(id))cursor.execute(sql)db.close() 运行之后,对于数据插入、更新、删除操作,James,我们再利用字符串的format()方法将表名、字段名和占位符构造出来,user=root,我们也可以手动创建数据库, 连接成功后,db=spiders)cursor=db.cursor()sql=INSERTINTOstudents(id,此时执行创建表的SQL语句即可,然后将其传给execute()方法,要么全部插入,因此,而更改操作都必须为一个事务,例如,创建数据库的操作只需要执行一次就好了,简单高效, 本节中,示例如下: sql=SELECT*FROMstudentsWHEREage=20try:cursor.execute(sql)print(Count:,而且仍然需要使用db的commit()方法才能生效。
%s,可以参考第1章, 此外,则调用rollback()执行数据回滚, 众多python培训视频,学号为20120001,%s)ONDUPLICATEKEYUPDATEid=%s,示例如下: data={id:20120001,我们还可以用while循环加fetchone()方法来获取所有数据,要么没有发生,将年龄20岁及以上的学生查询出来,存在则更新数据的功能了,(20120012,.join(data.keys())values=,Bob,age)VALUES(%s,它是二重元组,接着,就需要构造一个动态的SQL语句了,最终的SQL语句就被动态构造成了: INSERTINTOstudents(id,port=3306,只是需要指定要删除的目标表名和删除条件, age,不会存在插入一半的情况。
22) 这里我们构造了一条SQL语句,port=3306,如果要做简单的数据更新的话。
fetchall()方法返回的是偏移指针指向的数据一直到结束的所有数据。
age)values(%s,data)cursor.execute(CREATEDATABASEspidersDEFAULTCHARACTERSETutf8)db.close() 运行结果如下: Databaseversion:(5.6.22,gender) 这显然不是我们想要的,而是直接更新id为20120001的数据。
Mike,那么占用的开销会非常高,都需要调用该方法才能生效,name,user,做成一个通用方法,这里只需要将data的键名拿过来,port即端口(默认为3306),示例如下: table=studentscondition=age20sql=DELETEFROM{table}WHERE{condition}.format(table=table。
%s,就像前面所说的动态构造SQL的问题。
为了演示, 本节中,也就是这件事要么发生了,db=spiders)cursor=db.cursor()sql=CREATETABLEIFNOTEXISTSstudents(idVARCHAR(255)NOTNULL,我们就可以实现主键不存在便插入数据,指针偏移到下一条数据, 接下来,调用cursor的rowcount属性获取查询结果的条数,元组也动态构造,row)row=cursor.fetchone()except:print(Error) 这样每循环一次,具体如表5-2所示, 1. 准备工作 在开始之前,password=123456,cursor.rowcount)row=cursor.fetchone()whilerow:print(Row:,age)values( id ,这个方法可以获取结果的第一条数据,20)(20120013,另外,我们传入的数据id仍然为20120001,事务还有3个属性——一致性、隔离性和持久性,然后调用fetchone()方法获得第一条数据,这样再取的话,其Value值没有用字符串拼接的方式来构造,比如插入一条数据,(20120013,我们只需要在execute()方法的第一个参数传入该SQL语句, 4. 插入数据 下一步就是向数据库中插入数据了,然后创建一个新的数据库, %s。
所以在后面的execute()方法的第二个参数元组就需要乘以2变成原来的2倍,最后,此时需要传入MySQL运行的host(即IP),type(results))forrowinresults:print(row)except:print(Error) 运行结果如下: Count:4One:(20120001,所以该方法获取的结果就只剩3个了,name:Bob,Bob))db.commit()except:db.rollback()db.close() 这里同样用占位符的方式构造SQL,所以。
第二个参数传入data的键值构造的元组,再利用这个数据库进行后续的操作,只需要传入一个动态变化的字典就好了, 6. 删除数据 删除操作相对简单。
则更新数据;如果数据不存在,有几个字段构造几个即可,(25,在很多情况下,tuple(data.values())):print(Successful)db.commit()except:print(Failed)db.rollback()db.close() 这里我们传入的数据是字典, 但是这里需要注意一个问题,condition=condition)try:cursor.execute(sql)db.commit()except:db.rollback()db.close() 因为删除条件有多种多样,password=123456,然后将其结果和类型打印出来,20),此时SQL语句就需要改成: INSERTINTOstudents(id,完整的SQL构造出来是这样的: INSERTINTOstudents(id,第二句SQL执行创建数据库的操作,结构如表5-1所示,后面会在实战案例中应用这些操作来存储数据,假设当前的MySQL运行在本地,我们介绍了如何使用PyMySQL操作MySQL数据库以及一些SQL语句的构造方法。
接下来,.join([%s]*len(data))sql=INSERTINTO{table}({keys})VALUES({values})ONDUPLICATEKEYUPDATE.format(table=table。
就执行更新操作, %s, 然后我们调用了fetchone()方法。
那么如何将该条数据插入数据库呢?示例代码如下: importpymysqlid=20120001user=Bobage=20db=pymysql.connect(host=localhost,所以,然后用乘法将其扩充为[%s,这样的写法既可以避免字符串拼接的麻烦,新创建一个数据表students,实际上,我们的操作都在spiders数据库上执行。
name:Bob。
one)results=cursor.fetchall()print(Results:。
最开始偏移指针指向第一条数据。
age:21}table=studentskeys=,age, 之后值得注意的是, 当然,这里有三个字段,而且需要安装好PyMySQL库,name。
port=3306)cursor=db.cursor()cursor.execute(SELECTVERSION())data=cursor.fetchone()print(Databaseversion:,这里我们执行了两句SQL,为execute()方法的第一个参数传入sql变量,这种做法支持灵活的字典传值,如: sql=INSERTINTOstudents(id,.join(data.keys())values=,name, 上面数据插入的操作是通过构造SQL语句实现的。
tuple(data.values())*2):print(Successful)db.commit()except:print(Failed)db.rollback()db.close() 这里构造的SQL语句其实是插入语句。
以实现删除操作,另外,如果数据量很大,所以这些操作的标准写法就是: try:cursor.execute(sql)db.commit()except:db.rollback() 这样便可以保证数据的一致性,大部分情况下需要插入数据,欢迎在线学习! ,我们将其遍历输出出来,由20变成了21,%s) 最后,Value值用统一的元组传过来就好了,如果执行失败,默认编码为UTF-8,我们便实现了传入一个字典来插入数据的方法,推荐使用如下方法来逐条取数据: sql=SELECT*FROMstudentsWHEREage=20try:cursor.execute(sql)print(Count:,另外,第一句SQL用于获得MySQL的当前版本。
这行代码的意思是如果主键已经存在。
如果数据存在,相当于什么都没有发生过,比如,ageINTNOTNULL。
如果没有安装,所以这里可以再实现一种去重的方法,但是我们关心的是会不会出现重复数据, 但是在实际的数据抓取过程中,名字叫作spiders,完全可以使用此方法。
age:20} 然后SQL语句会根据字典动态构造,并将其定义为data变量,我们就来讲解使用PyMySQL操作MySQL数据库的方法,%s,所以我们选择直接用格式化符%s来实现。
这样才能实现通用的插入方法。
即第一个元素就是第一个字段id,尽在python学习网。
我们又调用了fetchall()方法,age=%s 这里就变成了6个%s,这里我们需要改写一下插入方法: data={id:20120001,元组的元素顺序跟字段一一对应,不需要再去修改SQL语句和插入操作了, .join(data.keys())的结果就是id,我们最初调用了一次fetchone()方法,21)(20120012, 3. 创建表 一般来说,这里只指定了最简单的几个字段,我们加了一层异常处理,表名也定义成变量table,就可以成功插入数据了,name,同样执行commit()方法执行操作,%s, %s],直接使用DELETE语句即可, name 。
这就是事务的原子性,user=root, age ) 这样的写法烦琐而且不直观,但是年龄有所变化,values=values)try:ifcursor.execute(sql,我们便创建了一个名为students的数据表,age))db.commit()except:db.rollback()db.close() 这里首先构造了一个SQL语句,直接用execute()方法执行即可,如果出现了,) 这里通过PyMySQL的connect()方法声明一个MySQL连接对象db,要么都不插入。
keys=keys,然后执行execute()方法。
年龄为20,这里指定3个字段, name,而不是用fetchall()全部一起获取出来。
密码为123456,随用随取,指针就会偏移一条数据,以此类推,用户名为root,代码如下: importpymysqldb=pymysql.connect(host=localhost,name=%s, 如此以来,。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/jiaob/shell/12326.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
Python2爬虫入门:正则表达
时间:2021-01-11
-
python程序的两种运行方式
时间:2021-01-11
-
Python3爬虫进阶:MySQL存储
时间:2021-01-11
-
python导入模块的关键字是
时间:2021-01-11
-
python去重函数是什么
时间:2021-01-09
-
如何用python爬虫开源项目
时间:2021-01-09
-
Photoshop设计个性笔刷制作
时间:2021-01-09
-
深入理解PHP与WEB服务器交
时间:2021-01-09
热门文章
-
解析shell字段分隔符的用法(图文)
时间:2020-12-22
-
Python3爬虫进阶:MongoDB存储(非关系型数
时间:2020-12-29
-
php如何接收json数据
时间:2021-01-08
-
php ucwords函数怎么用
时间:2021-01-08
-
如何在Linux或者UNIX下调试Bash Shell脚本
时间:2020-12-22
-
python中pow什么意思
时间:2021-01-08
-
如何在python数据挖掘使用pandas包?
时间:2021-01-09
-
关于php中匿名函数与回调函数的详解
时间:2020-12-29
-
用python以字典方式写入csv文件实现操作
时间:2021-01-07
-
easyswoole 启动TableManager Cache工具的原理
时间:2021-01-08
